﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using AutomationTools.Procedimentos.Exceptions;
using System.Windows.Forms;

namespace AutomationTools.Procedimentos.Acao.Aguardar
{
    public class AguardarExpressao<T> : IProcedimento
    {
        Func<T, bool> expressao;
        public AguardarExpressao(Func<T, bool> expressao)
        {
            this.expressao = expressao;
        }

        public object Executar(IContexto contexto)
        {
            ValidarEntrada(contexto);
            while (!expressao((T)contexto.Parametro))
            {
                Application.DoEvents();
            }
            return contexto.Parametro;
        }

        public void ValidarEntrada(IContexto contexto)
        {
            if (!(contexto.Parametro is T))
                throw new ParametroException(typeof(T), contexto.Parametro.GetType());
        }
    }
}
